import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;

/**
 * Klassen representerer et register/ en samling med rom
 * @author Morten
 *
 */
public class Romregister implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 18180494354360582L;
	private ArrayList <Rom> romliste ;
	
	public Romregister () {	
		romliste = new ArrayList<Rom>();
	}
	
	/**
	 * @return the romliste
	 */
	public ArrayList<Rom> getRomliste() {
		return romliste;
	}

	
	/**
	 * Metode som legger til et rom i listen
	 * @param ny rom som skal legges inn i listen
	 * @return true hvis rommet blir lagt til i listen, false hvis ikke
	 */
	public boolean leggTilRom(Rom ny) {
		return romliste.add(ny);
	}
	
	/**
	 * Metode som sletter et rom fra listen
	 * @param slettes er det romobjektet som skal slettes i listen
	 * @return true hvis rommet er blitt slettet, false hvis ikke.
	 */
	public boolean slettRom(Rom slettes) {
		return romliste.remove(slettes);
	}
	
	/**
	 * Sorterer rommene i lista.
	 */
	public void sorterRom() {
		Collections.sort(romliste);		
	}
	
	/**
	 * Metoden henter alle hotellrom fra romregisteret
	 * @return liste med hotellrom, null hvis det ikke er registrert noen hotellrom i listen. 
	 */
	public ArrayList <Hotellrom> getAlleHotellrom() {
		ArrayList <Hotellrom> returliste = new ArrayList <Hotellrom> ();
		for (Rom hrom : romliste) {
			if (hrom instanceof Hotellrom)
			{
				Hotellrom hotellrommet = (Hotellrom) hrom;
				returliste.add(hotellrommet);						
			}
		}	
	if (returliste.isEmpty())
		return null;
	return returliste;		
	}
	
	/**
	 * @param romliste the romliste to set
	 */
	public void setRomliste(ArrayList<Rom> romliste) {
		this.romliste = romliste;
	}

	/**
	 * Metoden henter alle seminarrom fra romregisteret
	 * @return liste med seminarrom, null hvis det ikke er registrert noen seminarrom i listen. 
	 */
	public ArrayList <Seminarrom> getAlleSeminarrom() {
		ArrayList <Seminarrom> returliste = new ArrayList <Seminarrom> ();
		for (Rom srom : romliste) {
			if (srom instanceof Seminarrom)
			{
				Seminarrom semrommet = (Seminarrom) srom;
				returliste.add(semrommet);						
			}
		}	
	if (returliste.isEmpty())
		return null;
	return returliste;		
	}
	
	/**
	 * Metoden henter alle hotellrom fra romregisteret der rommet har bestemte fasisliteter og er av en bestemt type
	 * @param fasiliteter liste med fasiliteter rommet skal inneholde.
	 * @param romtype string som angir romtype.
	 * @return liste med hotellrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Hotellrom> finnHotellRom(ArrayList <String> fasiliteter, String romtype) {
		ArrayList <Hotellrom> returliste = new ArrayList <Hotellrom> ();
		for (String fasilitet : fasiliteter) {
			for (Rom hrom : romliste) {
				if (hrom instanceof Hotellrom)
				{
					Hotellrom hotellrommet = (Hotellrom) hrom;
					if (hotellrommet.getHotellromtype().equals(romtype))
					{
						for (String romfasilitet : hotellrommet.getRomfasiliteter())
						{
							if (romfasilitet.equals(fasilitet))
								returliste.add(hotellrommet);
						}
					}		
				}
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;
		
	}
	
	/**
	 * Metoden henter alle hotellrom fra romregisteret der rommet har bestemte fasisliteter 
	 * @param fasiliteter liste med fasiliteter rommet skal inneholde.	 
	 * @return liste med hotellrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Hotellrom> finnHotellRom(ArrayList <String> fasiliteter) {
		ArrayList <Hotellrom> returliste = new ArrayList <Hotellrom> ();
		for (String fasilitet : fasiliteter) {
			for (Rom hrom : romliste) {
				if (hrom instanceof Hotellrom)
				{
					Hotellrom hotellrommet = (Hotellrom) hrom;					
						for (String romfasilitet : hotellrommet.getRomfasiliteter())
						{
							if (romfasilitet.equals(fasilitet))
								returliste.add(hotellrommet);
						}							
				}
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;		
	}
	
	/**
	 * Metoden henter alle hotellrom fra romregisteret der rommet er av en bestemt type	
	 * @param romtype string som angir romtype.
	 * @return liste med hotellrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Hotellrom> finnHotellRomEtterRomtype (String romtype ) {
		ArrayList <Hotellrom> returliste = new ArrayList <Hotellrom> ();
		for (Rom hrom : romliste) {
			if (hrom instanceof Hotellrom)
			{
				Hotellrom hotellrommet = (Hotellrom) hrom;					
				if (hotellrommet.getHotellromtype().equals(romtype))
					returliste.add(hotellrommet);
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;
	}
	
	/**
	 * Metoden henter alle hotellrom fra romregisteret der rommet inneholder en fasislitet
	 * @param fasilitet rommet skal inneholde.
	 * @return liste med hotellrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Hotellrom> finnHotellromEtterFasilitet (String fasilitet) {
		ArrayList <Hotellrom> returliste = new ArrayList <Hotellrom> ();
		for (Rom hrom : romliste) {
			if (hrom instanceof Hotellrom)
			{
				Hotellrom hotellrommet = (Hotellrom) hrom;
				for (String f : hotellrommet.getRomfasiliteter()) 
				{
					if (f.equals(fasilitet))
						returliste.add(hotellrommet);
				}
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;
	}
	
	/**
	 * Metoden henter alle seminarrom fra romregisteret der rommet er en bestemt romtype	 
	 * @param romtype string som angir romtype.
	 * @return liste med seminarrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Seminarrom> finnSeminarrom(String romtype) {
		ArrayList <Seminarrom> returliste = new ArrayList <Seminarrom> ();
		for (Rom semrom : romliste) 
		{
			if (semrom instanceof Seminarrom) 
			{
				Seminarrom seminarrommet = (Seminarrom) semrom;
				if (seminarrommet.getSeminarromtype().equals(romtype))
					returliste.add(seminarrommet);
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;
	}
	
	/**
	 * Metoden henter alle seminarrom fra romregisteret der rommet har bestemte fasisliteter og er av en bestemt type
	 * @param fasiliteter liste med fasiliteter rommet skal inneholde.
	 * @param romtype string som angir romtype.
	 * @return liste med seminarrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Seminarrom> finnSeminarromEtterFasiliteterogRomtype(ArrayList <String> fasiliteter, String romtype) {
		ArrayList <Seminarrom> returliste = new ArrayList <Seminarrom> ();
		for (String fasilitet : fasiliteter)
		{
			for (Rom semrom : romliste) 
			{
				if (semrom instanceof Seminarrom)
				{
					Seminarrom seminarrommet = (Seminarrom) semrom;
					if (seminarrommet.getSeminarromtype().equals(romtype))					
					{
						for ( String seminarromfasilitet : seminarrommet.getRomfasiliteter())
						{
							if(seminarromfasilitet.equals(fasilitet))
								returliste.add(seminarrommet);
						}						
					}
				}
			}
		}
		if (returliste.isEmpty())
			return null;
		return returliste;
	}
	
	/**
	 * Metoden henter alle seminarrom fra romregisteret der rommet har en fasislitet
	 * @param fasilitet rommet skal inneholde.	 
	 * @return liste med seminarrom, null hvis listen ikke inneholder noen rom.
	 */
	public ArrayList <Seminarrom> finnSeminarromEtterFasilitet (String fasilitet) {
		ArrayList <Seminarrom> returliste = new ArrayList <Seminarrom> ();
		for (Rom srom : romliste) {
			if (srom instanceof Seminarrom)
			{
				Seminarrom semrommet = (Seminarrom) srom;
				for (String f : semrommet.getRomfasiliteter()) 
				{
					if (f.equals(fasilitet))
						returliste.add(semrommet);
				}
			}
		}
		if (returliste.size()==0)
			return null;
		return returliste;
	}
	
	/**
	 * Metoden sjekker om det finnes et rom i registeret med dette nummeret.
	 * @param romnummer sjekker om romnummer er i bruk allerede
	 * @return true hvis romnummeret er i bruk, false hvis ikke.
	 */	
	public boolean sjekkOmRomnummerFinnes(String romnummer) {
		for (Rom element : romliste) 
		{
			if (element.getRomnummer().equals(romnummer))
				return true;
		}
		return false;
	}
	
	/**
	 * Override metode
	 * @return String med informasjon om romregisteret.
	 */
	public String toString() {
		String retur = "Romregister\n";
		
		for (Rom r : romliste)		
			retur += r.toString() + "\n";
		return retur;		
	}
}
